package agent;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;

import jade.core.behaviours.Behaviour;
import jade.core.behaviours.SequentialBehaviour;
import dao.DaoAgente;
import jade.core.AID;
import jade.core.Agent;
import jade.lang.acl.ACLMessage;
import model.Coordenada;
import model.Stop;


public class AgCoordenador extends Agent {

	private Coordenada origem;
	private Coordenada destino;
	ArrayList<Stop> stopsOrigem;
	
	private static final long serialVersionUID = 1L;
	
	protected void setup(){
		//System.out.println("Numero de subrotas = "+AreaRotas.getNumRotas());
		Object[] args = getArguments();
		if(args != null && args.length > 0){
			this.origem = (Coordenada)args[0];
			this.destino = (Coordenada)args[1];
			this.stopsOrigem = new ArrayList<Stop>();
			System.out.println("Argumento :"+args[0]);
			
			SequentialBehaviour seq = new SequentialBehaviour(this){//composto

				private static final long serialVersionUID = 1L;

				public int onEnd(){
					//implementar a remo��o da lista amarela
					block();
					///myAgent.doDelete();
					return 0;
				}
				
			};
			
			
			
			
			seq.addSubBehaviour(new Behaviour(this){ //comportamento de busca stops iniciais
				
				
				
				int raioOrigem = 0;
				
				DaoAgente dao = new DaoAgente();
				String msg = "";

				//executado enquanto done() retorne false
				public void action() {
					System.out.println("Exec comportamento...BUSCA STOP"+myAgent.getName());
					raioOrigem++;
					stopsOrigem = dao.getStopsOfCoordRaio(origem.getLat(), origem.getLon(), raioOrigem);
				}

				//Se retornar true o comportamento e finalizado
				public boolean done() {
					if(stopsOrigem.size()>0){
						System.out.println("Achei "+stopsOrigem.size()+" pontos em raio = "+raioOrigem);
						AreaRotas.setNumStops(stopsOrigem.size());
						return true;
					}
					for(int i=0; i<stopsOrigem.size(); i++){
						double distStop = destino.calculaDistancia(stopsOrigem.get(i).getStop_lat(), stopsOrigem.get(i).getStop_lon());
						if(distStop <= 1000){
							AreaRotas.setMsg("Nenhum ponto de transporte encontrado");
							System.out.println("Raio origem proximo do destino...");
							//====================Falta linalizar agente para este caso
							return true;
						}
						
					}
					double distOrgDstn = origem.calculaDistancia(destino.getLat(),destino.getLon());
					if(distOrgDstn <= 600){
						AreaRotas.setMsg("Destino proximo demais da origem");
						System.out.println("Destino proximo demais da origem...");
						//========================Falta linalizar agente para este caso
						return true;
					}
					return false;
				}

			});//fim do comportamento de busca stops iniciais
			
			
			seq.addSubBehaviour(new Behaviour(this){ //envia mensagem
				int cont = 0;

				@Override
				public void action() {
					System.out.println("Exec comportamento...ENVIA MSG "+myAgent.getName());
					Hashtable obj = new Hashtable();
					obj.put("origem", origem);
					obj.put("destino", destino);
					System.out.println("Enviando stop num = "+stopsOrigem.get(cont).getStop_id());
					obj.put("stopOrigem", stopsOrigem.get(cont));
					
					try{
						ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
						msg.addReceiver(new AID("Buscador"+cont, AID.ISLOCALNAME));
						msg.setContent("stopOrigem");
						msg.setContentObject(obj);
						myAgent.send(msg);
						cont++;
					}catch(IOException e){
						e.printStackTrace();
					}
				}

				@Override
				public boolean done() {
					
					return (cont == stopsOrigem.size());
				}
				
			});//fim do envia mensagem
			
			addBehaviour(seq);
			
			
		}
		else{
			System.out.println("Sem argumentos...");
			doDelete();
		}
	}
	
	protected void takeDown(){
		System.out.println("Agente: "+getAID().getName()+" esta finalizado...");
	}
	
	

}
